home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Libraries / objects in c ƒ / OIC Sources / DependentsMixin.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-03-05  |  2.9 KB  |  137 lines  |  [TEXT/KAHL]

  1. /*    
  2.  *        DependentsMixin abstract class
  3.  *
  4.  *            a mixin that keeps a list of dependent objects and implements
  5.  *            a change propogation semantics. Useful for "Active value"
  6.  *            or "deamon" based programming. 
  7.  *
  8.  *            Copyright © John Wainwright 1989
  9.  *
  10.  *    SuperClasses :
  11.  *
  12.  *  Instance Vars :
  13.  *        
  14.  *                    dependents        - the dependent list
  15.  *
  16.  *    Class Vars :
  17.  *    
  18.  *    Methods :
  19.  *
  20.  *                    addDependents o        - add object to dependent list
  21.  *                    dltDependent o        - delete object from dependent list
  22.  *                    dependentsOf        - return dependent list
  23.  *                    changed                - this object has changed, propogate news
  24.  *                                            to all dependents
  25.  *                    changing            - this object is about to change; prepare way.
  26.  *                    dispose                - disposes the dependent list
  27.  *
  28.  *    Class Methods :
  29.  *
  30.  */
  31.  
  32. #include "oic.h"
  33. #include "generics.h"
  34.  
  35. class         DependentsMixin;                /* the DependentsMixin class         */
  36.  
  37. struct DependentsMixin_i                    /* DependentsMixin instance structure */
  38. {
  39.     object    dependents;                        /* dependent List                    */
  40. };
  41. typedef struct DependentsMixin_i DependentsMixin_i;
  42.  
  43. /* -------------------- DependentsMixin Instance methods ------------------- */
  44.  
  45. method object
  46. _addDependent(self, d, op)
  47.     object                        self;
  48.     register DependentsMixin_i    *d;
  49.     register object                *op;
  50. {
  51.     if (d->dependents == NULL)
  52.         d->dependents = New(List, *op, END);
  53.     else
  54.         d->dependents = push(d->dependents, *op);
  55.     return *op;
  56. }
  57.  
  58. method object
  59. _dltDependent(self, d, op)
  60.     object                        self;
  61.     register DependentsMixin_i    *d;
  62.     register object                *op;
  63. {
  64.     if (d->dependents == NULL)
  65.         d->dependents = New(List, END);
  66.     else
  67.         d->dependents = delete(d->dependents, *op);
  68.     return *op;
  69. }
  70.  
  71. method object
  72. _dependentsOf(self, d)
  73.     object                        self;
  74.     register DependentsMixin_i    *d;
  75. {
  76.     if (d->dependents == NULL)
  77.         d->dependents = New(List, END);
  78.  
  79.     return d->dependents;
  80. }
  81.  
  82. method object
  83. _changed(self, d)
  84.     object                        self;
  85.     register DependentsMixin_i    *d;
  86. {
  87.     register object    seq, dependent;
  88.     
  89.     if (d->dependents == NULL)
  90.         d->dependents = New(List, END);
  91.  
  92.     for (seq = sequence(d->dependents); dependent = next(seq); )
  93.         hasChanged(dependent, self);
  94.     
  95.     return self;
  96. }
  97.  
  98. method object
  99. _changing(self, d)
  100.     object                        self;
  101.     register DependentsMixin_i    *d;
  102. {
  103.     register object    seq, dependent;
  104.     
  105.     if (d->dependents == NULL)
  106.         d->dependents = New(List, END);
  107.  
  108.     for (seq = sequence(d->dependents); dependent = next(seq); )
  109.         isChanging(dependent, self);
  110.     
  111.     return self;
  112. }
  113.  
  114. method void
  115. _dispose(self, d)
  116.     object                        self;
  117.     register DependentsMixin_i    *d;
  118. {
  119.     dispose(d->dependents);
  120. }
  121.  
  122. /* ------------------- Init the DependentsMixin class ---------------------- */
  123.  
  124. InitDependentsMixin()
  125. {
  126.     DependentsMixin = NewClass(sizeof(DependentsMixin_i), 0, "DependentsMixin", END);
  127.     AddMethods(DependentsMixin,
  128.         addDependentGeneric,     _addDependent,
  129.         dltDependentGeneric,    _dltDependent,
  130.         dependentsOfGeneric,    _dependentsOf,
  131.         changedGeneric,            _changed,
  132.         changingGeneric,        _changing,
  133.         disposeGeneric,            _dispose,        
  134.         END);
  135. }
  136.  
  137.